package com.FFmpeg;

import cn.hutool.core.io.FileUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.File;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author 航
 * @date 2024/07/08 16:07
 * 下载了FFmpeg的包，类似与jdk的那个，配置了环境变量，放在D盘了
 * 之后，直接用代码调用命令行，进行操作
 **/
public class FFmpegExecute {

    private static final Logger logger = LogManager.getLogger(FFmpegExecute.class);

    /**
     * 处理文件夹下的视频文件
     * @param url
     */
    public void folder(String url){
        RunCommandInDirectory runCommandInDirectory = new RunCommandInDirectory();
        ExecutorService executorService = Executors.newFixedThreadPool(RunCommandInDirectory.THREAD_POOL_SIZE);

        // 获得当前文件夹（包括子文件夹）下所有视频文件
        // 文件路径不能有空格
        List<File> files = FileUtil.loopFiles(url);

        // 只允许后缀在set中的文件进行处理
        Set<String> set = Stream.of(
                "mp4",
                        "ts",
                        "avi",
                        "rm",
                        "wmv",
                        "rmvb",
                        "mpg",
                        "RM",
                        "mkv")
                .collect(Collectors.toSet());


        for(File file : files){
            String suffix = FileUtil.extName(file);
            if (suffix == null || !set.contains(suffix)){
                continue;
            }
            // 获得当前文件名，并将文件名中的空格删除
            String fileName = FileUtil.mainName(file);
            fileName = fileName.replaceAll(" ", "-");
            fileName = fileName.replaceAll("@", "-");
            File newFile = new File(file.getParent(), fileName + "." + FileUtil.extName(file));
            file.renameTo(newFile);
            executorService.submit(() -> {
                try {
                    runCommandInDirectory.deleteFirstSecond(newFile.getParent(), newFile.getName());
                } catch (Exception e) {
                    logger.error(e.getMessage());
                }
            });
        }
        executorService.shutdown();
    }

    public File fixName(String fileSrc){
        File file = new File(fileSrc);
        // 获得当前文件名，并将文件名中的空格删除，最后重命名
        String fileName = FileUtil.mainName(file);
        fileName = fileName.replaceAll(" ", "-");
        fileName = fileName.replaceAll("@", "-");
        File newFile = new File(file.getParent(), fileName + "." + FileUtil.extName(file));
        file.renameTo(newFile);
        return newFile;
    }

    /**
     * 处理单个文件，并删除第一秒
     * @param fileSrc
     * @throws Exception
     */
    public void oneFile(String fileSrc) throws Exception {
        RunCommandInDirectory runCommandInDirectory = new RunCommandInDirectory();
        File newFile = fixName(fileSrc);
        runCommandInDirectory.deleteFirstSecond(newFile.getParent(), newFile.getName());
    }

    /**
     * 修改单个文件的格式
     * @param fileSrc 文件路径
     * @param toFormat 文件转换目标格式
     */
    public void convertFormatOneFile(String fileSrc, String toFormat) throws Exception {
        RunCommandInDirectory runCommandInDirectory = new RunCommandInDirectory();
        File newFile = fixName(fileSrc);
        runCommandInDirectory.convertFormat(newFile.getParent(), newFile.getName(), toFormat);
    }

    // 获得路径下所有mkv的字幕文件
    public void getAssFile(String path){
        RunCommandInDirectory runCommandInDirectory = new RunCommandInDirectory();
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        // 获得当前文件夹（包括子文件夹）下所有视频文件
        // 文件路径不能有空格
        List<File> files = FileUtil.loopFiles(path);

        // 只允许后缀在set中的文件进行处理
        Set<String> set = Stream.of("mkv")
                .collect(Collectors.toSet());

        for(File file : files){
            String suffix = FileUtil.extName(file);
            if (null == suffix || !set.contains(suffix)){
                continue;
            }
            executorService.submit(() -> {
                runCommandInDirectory.getAss(file);
            });
        }
        executorService.shutdown();
    }

    public void mkvToMp4(String path){
        // 1、获得mkv的字幕文件
        // 本次已运行过上面代码，之后需要再补。

        // 2、获得mkv
        List<File> files = FileUtil.loopFiles(path, (file) -> {
            Set<String> set = Stream.of("mkv").collect(Collectors.toSet());
            return set.contains(FileUtil.extName(file));
        });
        for (File sourceFile : files){
            RunCommandInDirectory runCommandInDirectory = new RunCommandInDirectory();
            runCommandInDirectory.mkvToMp4(sourceFile, new File(FileUtil.mainName(sourceFile) + ".ass"));
        }

    }
    public static void main(String[] args) throws Exception {
        FFmpegExecute fFmpegTest = new FFmpegExecute();

        // 删除第一秒
        fFmpegTest.folder("url");
//        fFmpegTest.oneFile("url");

        // 获取ass字幕文件
        //fFmpegTest.getAssFile("E:\\BaiduNetdiskDownload\\小林家的龙女仆S");
        // mkv转mp4 同时处理字母
        // fFmpegTest.mkvToMp4("E:\\BaiduNetdiskDownload\\小林家的龙女仆S");

        // 只修改视频格式
//        fFmpegTest.convertFormatOneFile(
//                "E:\\IDM下载\\《德云社纲丝节“同心同德”之特别奉献专场之一 2024》美益达影视- www.meiyd11.com.ts",
//                "mp4"
//        );

    }
}
